<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>list & array </title>
</head>
<body>
<script>
    //与其说是数组, 不如说是类似于Java中的 集合, 有个问题就是必须指定长度, 否则可能出错
    var array1 = [];
    array1[0] = "凤舞九天";
    array1[1] = false;
    array1[2] = 123;
    //创建一个对象
    array1[3] = {
        name: "sky",
        sex: 1,
        flag: true

    };


    /**
     * JavaScript 方法 toString() 把数组转换为数组值（逗号分隔）的字符串。
     * */
    console.log(array1.toString());

    /**
     * join() 方法也可将所有数组元素结合为一个字符串。它的行为类似 toString()，但是您还可以规定分隔符：
     * */
    console.log(array1.join(" - "));

    /**
     * pop() 方法返回“被弹出”的值：
     * */
    let deletedObj = array1.pop();              // 从 array1 删除最后一个元素

    console.log(array1.join(" - "));
    /**
     * push() 方法返回新数组的长度：
     * */
    let newLength = array1.push("Kiwi");       //  向 array1 添加一个新元素
    console.log(array1.join(" - "));


    let shiftObj = array1.shift();
    console.log(array1.join(" - "));


    /**
     * unshift() 方法（在开头）向数组添加新元素，并“反向位移”旧元素：
     * */
    var fruits = ["Banana", "Orange", "Apple", "Mango"];
    newLength = fruits.unshift("Lemon");    // 向 fruits 添加新元素 "Lemon"
    console.log(fruits.join(" - "));

    /**
     * JavaScript 数组属于对象，其中的元素就可以使用 JavaScript delete 运算符来删除
     * 使用 delete 会在数组留下未定义的空洞。请使用 pop() 或 shift() 取而代之。
     * */
    delete fruits[2];
    console.log(fruits.join(" - "));
    console.log('fruits[2] ==> ', fruits[2]);

    /**
     *
     *
     *
     * 拼接数组  splice() 方法可用于向数组添加新项：
     * 第一个参数（2）定义了应添加新元素的位置（拼接）。
     第二个参数（0）定义应删除多少元素。
     其余参数（“Lemon”，“Kiwi”）定义要添加的新元素。
     splice() 方法返回一个包含已删除项的数组：
     * */
    fruits = ["Banana", "Orange", "Apple", "Mango"];
    fruits.splice(2, 0, "Lemon", "Kiwi");
    console.log(fruits.join(" - "));


    /**
     * concat() 方法不会更改现有数组。它总是返回一个新数组。
     * concat() 方法可以使用任意数量的数组参数：
     * */
    var arr1 = ["Cecilie", "Lone"];
    var arr2 = ["Emil", "Tobias", "Linus"];
    var arr3 = ["Robin", "Morgan"];
    var myChildren = arr1.concat(arr2, arr3);   // 将arr1、arr2 与 arr3 连接在一起

    console.log(myChildren.join(" - "));


    /**
     * 裁剪数组
     slice() 方法用数组的某个片段切出新数组。
     本例从数组元素 1 （"Orange"）开始切出一段数组：
     slice() 可接受两个参数，比如 (1, 3)。
     该方法会从开始参数选取元素，直到结束参数（不包括）为止。

     * */
    fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
    var citrus = fruits.slice(3);
    console.log(citrus.join(" - "));
    fruits = ["Banana", "Orange", "Lemon", "Apple", "Mango"];
    citrus = fruits.slice(1, 4);
    console.log(citrus.join(" - "));


    /**
     * indexOf() 方法在数组中搜索元素值并返回其位置。
     * */
    let position = fruits.indexOf("Apple");
    console.log(position);


    /**
     * ECMAScript 2016 引入了 Array.includes() 方法。它允许我们检查数组中是否包含某个元素（包括 NaN，与 indexOf 不同）。
     * */
    console.log(fruits.includes("Mango")); // 返回 true


    fruits = ["Banana", "Orange", "Apple", "Mango"];
    fruits.sort();            // 对 fruits 中的元素进行排序
    console.log(fruits.join(" - "));
    fruits.reverse();         // 反转元素顺序
    console.log(fruits.join(" - "));

    /**
     * 数字排序
     默认地，sort() 函数按照字符串顺序对值进行排序。
     该函数很适合字符串（"Apple" 会排在 "Banana" 之前）。
     不过，如果数字按照字符串来排序，则 "25" 大于 "100"，因为 "2" 大于 "1"。
     正因如此，sort() 方法在对数值排序时会产生不正确的结果。
     我们通过一个比值函数 (类似 Java 的compare 函数)来 来修正此问题：
     比较函数的目的是定义另一种排序顺序。 比较函数应该返回一个负，零或正值，这取决于参数：
     * */
    var points = [40, 100, 1, 5, 25, 10];
    points.sort(function (a, b) {
        return a - b
    });
    console.log(points.join(" - "));


    let cars = [
        {type: "Volvo", year: 2016},
        {type: "Saab", year: 2001},
        {type: "BMW", year: 2010}
    ];
    cars.sort(function(a, b){return a.year - b.year});
    cars.forEach( function ( item ) {
        console.log(item );
    });

    /**
     * 数组映射
     * */

    var numbers1 = [45, 4, 9, 16, 25];
    var numbers2 = numbers1.map(  function  (value, index, array) {
        return value * 2;
    });
    console.log(numbers2.join(" - "));

    console.log(numbers2  instanceof Array );



    /**
     * TODO  还有一些 关于集合对象的新特性;  类似于  Java 8  lambda 编程
     * */
    let  numbers = [45, 4, 9, 16, 25];
    let  over18Array = numbers.filter(   function  (value , index , array) {
        return value > 18;
    });
    console.log(over18Array.join(" - "));






</script>
</body>
</html>
